/**
 * 完成分片处理；
 * 分时处理数据，防止阻塞主线程
 * @param datas 参数可以是数组或数字
 * @param consumer 消费者函数
 * @returns
 */
export function performChunk<T extends Function>(
  // datas参数可以是数组或数字
  datas: T[] | number,
  // consumer参数是一个函数，用于处理数据
  consumer: Function
) {
  // 如果datas是数字，则将其转换为数组
  if (typeof datas === 'number') {
    datas = new Array(datas)
  }
  // 如果datas是空数组，则直接返回
  if (datas.length === 0) {
    return
  }
  // 初始化计数器
  let i = 0
  // 定义一个内部函数，用于递归处理数据
  function _run() {
    // 如果计数器等于datas的长度，则返回
    if (i === (datas as Array<T>).length) {
      return
    }
    // 使用requestIdleCallback函数，在空闲时间处理数据
    requestIdleCallback((idle) => {
      // 当空闲时间大于0且计数器小于datas的长度时，处理数据
      while (idle.timeRemaining() > 0 && i < (datas as Array<T>).length) {
        // 获取当前数据
        const item = (datas as Array<T>)[i]
        // 调用consumer函数处理数据
        consumer(item, i)
        // 计数器加1
        i++
      }
      // 递归调用_run函数
      _run()
    })
  }
  // 调用_run函数
  _run()
}
